// pages/route-planner/route-planner.js
const api = require('../../utils/api')
const locationUtil = require('../../utils/location')

Page({
  data: {
    currentLocation: null,
    nearbyPOIs: [],
    weather: null,
    selectedPOI: null,
    loading: false,
    hasLocationPermission: false,
    permissionChecked: false
  },

  onLoad() {
    this.initPage()
  },

  onShow() {
    // 每次显示页面时检查权限状态
    // 需求 4.2, 4.4: 根据权限状态启用或禁用功能
    this.checkAndHandlePermission()
  },

  async initPage() {
    // 需求 1.1: 收集用户的当前位置信息
    console.log('路径规划页面初始化')
    
    if (!this.data.hasLocationPermission) {
      return
    }

    this.setData({ loading: true })

    try {
      // 获取当前位置
      await this.loadCurrentLocation()
      
      // 并行加载天气和景点数据
      await Promise.all([
        this.loadWeather(),
        this.loadNearbyPOIs()
      ])
    } catch (err) {
      console.error('初始化失败:', err)
      wx.showToast({
        title: err.message || '加载失败',
        icon: 'none'
      })
    } finally {
      this.setData({ loading: false })
    }
  },

  /**
   * 检查并处理位置权限
   * 需求 4.2: 用户授予权限时，启用位置追踪功能
   * 需求 4.4: 用户拒绝权限时，禁用需要位置的功能
   */
  async checkAndHandlePermission() {
    try {
      const result = await locationUtil.checkLocationPermission()
      
      this.setData({
        hasLocationPermission: result.hasPermission,
        permissionChecked: true
      })

      if (result.hasPermission) {
        // 需求 4.2: 权限已授予，启用位置追踪功能
        console.log('位置权限已授予，启用相关功能')
        // 可以在这里加载位置相关数据
      } else {
        // 需求 4.4: 权限未授予，禁用需要位置的功能
        console.log('位置权限未授予，禁用相关功能')
      }
    } catch (err) {
      console.error('检查权限失败:', err)
      this.setData({
        hasLocationPermission: false,
        permissionChecked: true
      })
    }
  },

  /**
   * 请求位置权限
   * 需求 4.1: 请求位置访问权限并说明使用目的
   */
  async onRequestPermission() {
    const result = await locationUtil.requestLocationPermission(true)
    
    if (result.granted) {
      // 需求 4.2: 权限已授予，启用位置追踪功能
      this.setData({
        hasLocationPermission: true
      })
      
      wx.showToast({
        title: '权限已开启',
        icon: 'success'
      })
      
      // 重新初始化页面数据
      this.initPage()
    } else {
      // 需求 4.4: 权限被拒绝，禁用需要位置的功能
      this.setData({
        hasLocationPermission: false
      })
    }
  },

  /**
   * 跳转到权限说明页面
   */
  onNavigateToPermissionGuide() {
    wx.navigateTo({
      url: '/pages/permission-guide/permission-guide?returnUrl=' + 
           encodeURIComponent('/pages/route-planner/route-planner')
    })
  },

  /**
   * 获取当前位置
   * 需求 1.1: 收集用户的当前位置信息
   */
  async loadCurrentLocation() {
    try {
      const location = await locationUtil.getCurrentLocation()
      this.setData({
        currentLocation: {
          latitude: location.latitude,
          longitude: location.longitude
        }
      })
      console.log('当前位置:', location)
    } catch (err) {
      console.error('获取位置失败:', err)
      throw new Error('无法获取位置信息')
    }
  },

  /**
   * 加载附近景点
   * 需求 1.3: 搜索当前景点
   * 需求 1.4: 展示可选景点（名称、距离、类别、评分）
   */
  async loadNearbyPOIs() {
    if (!this.data.currentLocation) {
      return
    }

    try {
      const pois = await api.searchPOIs(this.data.currentLocation, 3000)
      
      // 计算距离并格式化数据
      const formattedPOIs = pois.map(poi => {
        const distance = this.calculateDistance(
          this.data.currentLocation,
          poi.location
        )
        
        return {
          id: poi.id,
          name: poi.name,
          location: poi.location,
          category: poi.category || '景点',
          rating: poi.rating || 0,
          distance: Math.round(distance),
          description: poi.description || ''
        }
      })

      // 按距离排序
      formattedPOIs.sort((a, b) => a.distance - b.distance)

      this.setData({
        nearbyPOIs: formattedPOIs
      })

      console.log('加载景点成功:', formattedPOIs.length)
    } catch (err) {
      console.error('加载景点失败:', err)
      wx.showToast({
        title: '加载景点失败',
        icon: 'none'
      })
    }
  },

  /**
   * 加载天气信息
   * 需求 1.2: 获取当前天气数据
   * 需求 5.3: 显示天气预报信息
   */
  async loadWeather() {
    if (!this.data.currentLocation) {
      return
    }

    try {
      const weatherData = await api.getCurrentWeather(this.data.currentLocation)
      
      this.setData({
        weather: {
          temperature: weatherData.temperature,
          condition: weatherData.condition,
          humidity: weatherData.humidity,
          windSpeed: weatherData.wind_speed,
          aqi: weatherData.aqi,
          suitable: weatherData.suitable,
          warning: weatherData.warning
        }
      })

      // 需求 5.2: 天气不适宜时发出警告
      if (weatherData.warning) {
        wx.showModal({
          title: '天气提示',
          content: weatherData.warning,
          showCancel: false
        })
      }

      console.log('天气数据:', weatherData)
    } catch (err) {
      console.error('加载天气失败:', err)
      // 天气加载失败不阻塞主流程
    }
  },

  /**
   * 计算两点间距离（米）
   * 使用 Haversine 公式
   */
  calculateDistance(loc1, loc2) {
    const R = 6371e3 // 地球半径（米）
    const φ1 = loc1.latitude * Math.PI / 180
    const φ2 = loc2.latitude * Math.PI / 180
    const Δφ = (loc2.latitude - loc1.latitude) * Math.PI / 180
    const Δλ = (loc2.longitude - loc1.longitude) * Math.PI / 180

    const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
              Math.cos(φ1) * Math.cos(φ2) *
              Math.sin(Δλ / 2) * Math.sin(Δλ / 2)
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))

    return R * c
  },

  /**
   * 选择景点
   * 需求 1.4: 实现景点选择功能
   */
  onPOISelect(e) {
    const poi = e.currentTarget.dataset.poi
    
    this.setData({
      selectedPOI: poi
    })

    console.log('选择景点:', poi)
  },

  /**
   * 开始散步
   * 需求 1.5: 启动导航模式并开始散步会话
   */
  async onStartWalking() {
    // 需求 4.4: 检查权限，如果没有权限则提示
    if (!this.data.hasLocationPermission) {
      wx.showModal({
        title: '需要位置权限',
        content: '开始散步需要获取您的位置信息，请先授予位置权限。',
        confirmText: '去授权',
        cancelText: '取消',
        success: (res) => {
          if (res.confirm) {
            this.onNavigateToPermissionGuide()
          }
        }
      })
      return
    }

    // 检查是否选择了景点
    if (!this.data.selectedPOI) {
      wx.showToast({
        title: '请先选择一个景点',
        icon: 'none'
      })
      return
    }

    wx.showLoading({
      title: '规划路线中...'
    })

    try {
      // 生成路线
      const routeData = await api.generateRoute({
        start_location: this.data.currentLocation,
        target_poi_id: this.data.selectedPOI.id,
        weather: this.data.weather
      })

      // 创建散步会话
      const session = await api.startSession({
        target_poi_id: this.data.selectedPOI.id,
        route_id: routeData.route.id
      })

      wx.hideLoading()

      // 跳转到导航页面
      wx.navigateTo({
        url: `/pages/navigation/navigation?sessionId=${session.id}&poiName=${this.data.selectedPOI.name}`
      })
    } catch (err) {
      wx.hideLoading()
      console.error('开始散步失败:', err)
      wx.showModal({
        title: '启动失败',
        content: err.message || '无法开始散步，请稍后重试',
        showCancel: false
      })
    }
  }
})
